将SIM800 AT指令发送的数据上传到服务器

5

我在向远程服务器发送数据方面遇到了困难,我能够发送一个POST请求但不确定如何添加数据以便被服务器接收。

我已经阅读了数据表格http://www.jarzebski.pl/datasheets/SIM900_https-121018-1.00.pdf

尝试过:

# usual at+sapbr=1,1 set up
+HTTPINIT
+HTTPPARA = “CID”,1
+HTTPPARA="URL","IP-ADDRESS:PORT"
+httpdata=100,10000
# Where do I add the post data ?
+httpaction=1

这个程序会发送HTTP POST请求。但是,我该如何添加数据呢?我尝试将数据添加到URL中(如?key=val),但无济于事。希望能在此得到帮助。


恭喜你找到了解决方案!你能否把最新编辑的内容放到答案里呢?在这种情况下,回答自己的问题是完全可以的,也是正确的做法。 - hlovdal
2个回答

15

httpdata=100,10000 表示 SIM800 应该在 10 秒内期望收到 100 字节。

这是我使用 HTTP 客户端完成此操作的方法:

AT+HTTPINIT
AT+HTTPPARA="CID",1
AT+HTTPPARA="URL","http://url.com/endPoint"
AT+HTTPPARA="CONTENT","application/json"
AT+HTTPDATA=40,10000

此时,SIM800应该回复“DOWNLOAD”,表示它正在等待您的数据。发送您的数据;在我的情况下:

{"location_id": 238, "fill_percent": 90}

等待10秒钟后再发送剩余的指令。然后:

AT+HTTPACTION=1
AT+HTTPREAD
AT+HTTPTERM

这对我很有帮助,希望也能帮到你。

这是我获取信息的来源:http://www.raviyp.com/embedded/194-sim900-gprs-http-at-commands

在后端,我使用 Python Flask 编写了以下代码:

@app.route('/reportTrashLevel', methods=['POST'])
def report_trash_level():
    data = request.get_json()
    database.insert_trash_level(data)

    return Response(status=200)

请问您能提供服务器端编写的代码吗? - alex
1
@alex 我已经编辑了答案,以反映我使用的代码。 - Alan Alvarez
根据文件,您可以使用的标题数量有限,因此如果您有类似授权标头令牌之类的内容,则应使用@trojan_spike使用的TCP连接样式。 - Ross Rogers

8
我成功让它做到了我需要的功能,这段代码片段可能会帮助其他人。
AT+CGATT=1                  # enter GPRS configuration mode 
AT+CIPMUX=0                 # Disable multi IP connection mode.  Single IP cnxn only
AT+CSTT="APN","USER","PASS"
AT+CIICR                    # bring up wireless connection with GPRS and CSD 
AT+CIFSR                    # ip up - gprs working
AT+CIPSHUT                  # Exit GPRS configuration mode

# Now do a post request to remote server api in json format. 
# Change IP_ADDR|DOMAIN for the IP or domain name of your server.  
# Change 2000 to its port
AT+CIPSTART="TCP","IP_ADDR|DOMAIN","2000"

AT+CIPSEND=119 # Num of char in tcp/ip data, \r & \n count as 1 char
POST /post HTTP/1.1
Host: **.**.***.***
Content-Type: application/json
Content-Length:23

{"postkey":"postvalue"}

希望这能帮助下一个遇到困难的人。

几年后它做到了 - 谢谢!我唯一不明白的是AT+CIPSHUT(关闭连接)。在打开新连接之前需要这样做吗?在我看过的另一个例子中,它是在发送数据后使用的,这更容易理解。 - ximo
顺便提一下,这适用于SIM7000,可能也适用于其他更近期的SIMCOM芯片。我认为其他答案中提到的AT+HTTP...命令不再受支持。 - ximo
另外,AT+CIFSR 有点不稳定,它不会像人们期望的那样回复 OK+CIFSR: <ip>。我发现 AT+CIFSREX 更加可靠(而且出于某种原因更快)。至少 SIM7000 支持它。 - ximo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接