微信公众号实现简易的物联网控制(二)

命令下发

先来看一段OneNet文档说明:

命令是指应用发送命令数据给OneNet设备云、再由OneNet设备云转发给终端设备、终端设备收到命令后可以向设备云反馈响应的一种工作机制。命令下发后,应用可以通过API查询命令状态和提取命令的响应数据。

命令的执行步骤如下:

1、  应用通过API向设备云发送命令数据;

2、  设备云生成该命令的uuid作为该命令的唯一标识并向应用返回,同时向终端设备转发命令数据;

3、  终端设备收到命令数据后执行命令数据,可以生成响应,也可以不响应;

4、  设备云跟踪记录命令的响应,如果设备有响应,就关联命令uuid和响应结果;

5、  应用通过API向设备云提取命令执行结果(API请求中携带命令uuid标识)。

特别说明:

命令下发到终端设备后,如果终端设备10秒内未收到响应,则此命令的状态将被设置为超时,应用通过API查询命令状态时,会反馈超时。超过10秒后收到的响应会被丢弃。

终端设备针对同一条命令回复多条命令响应,只有在未超时时间内收到的第一条是有效响应,后续的响应包将会被直接丢弃。因此终端设备应该对每个命令只有一个响应包。


下面是请求格式,这个地方有些坑,和官网的公开协议产品指南有所不同,刚开始按照官网的来实现始终报,后来在其他文档里面找到了这个才最终调试通了


HTTP方法

POST

URL

http://<API_ADDRESS>/cmds

HTTP头部

api-key:xxxx-ffff-zzzzz,必须master key

URL参数

device_id = //接收该数据的设备ID,必填。

HTTP内容

用户自定义Json或二进制数据(小于64K)

成功返回

{

"errno": 0,

"error":“succ”,

"data":{

//不超过64个字符字符串

"cmd_uuid":“2302-312-FWs”

}

}



import requests

class OneNet():
    def __init__(self,key,dev_id,cmd):
        self.api_key = key
        self.dev_id = dev_id
        self.cmd = cmd
        self.header = {'api-key': self.api_key}
    def send_cmd(self):
        params = {'device_id':self.dev_id}
        url = "http://api.heclouds.com/cmds?"
        r = requests.session()
        res = r.post(url, headers=self.header, params=params,data=self.cmd)
        print(res.content)

t = OneNet(you api_key,your dec_id, cmd)
t.send_cmd()
使用自带的requests库来实现post请求

最后的结果

{"errno":0,"data":{"cmd_uuid":"5bdaf1a9-3854-5e5f-b662-b1e3ef57ea6e"},"error":"succ"}



努力成为一名GEEK!
原文地址:https://www.cnblogs.com/FanMLei/p/10501035.html