
ONENET设备终端接入协议3_MODBUS.doc
6页MODBUS-TCP欢迎访问设备云门户网站注册用户,获取最新文档版本号修订日期修订内容说明V1.0新增V1.22015/8/5Dtu设备登录传输项目IDV1.32016/02/18增加接入流程例子V1.42016/07/06实现01,02,03,04功能码周期查询通过URL获取服务IP和PORT设备定时发送心跳包通过restfull api主动下发命令1 说明基于《modbus协议.pdf》实现01,02,03,04功能码周期查询适用于设备云定期主动发送modbus-tcp命令到设备查询寄存器值,设备回复寄存器值的情况2 名词解释项目ID:在平台注册账号后,添加新项目平台生成数字ID;Api-key:管理每个项目下资源,用于restful api鉴权3 设备接入1 访问设备云门户注册用户,可以查看〔项目ID和master_key
name9字节设备名称字符串,以’\0’结尾,目前作为保留用途phone12字节设备通信卡号码,以’\0’结尾注册设备时作为auth_info属性子域json对象的key,用于鉴权svrpwd9字节服务器登录密码,以’\0’结尾注册设备时作为auth_info属性子域json对象的value,用于鉴权id11字节项目ID,以’\0’结尾,平台申请项目时分配的项目ID字符串4 设备登录成功后,服务器不会返回数据,如果登录失败,服务器会主动断开连接 4 数据流4.1 业务平台调用restfull api为设备新增数据流,数据流需要指定如下属性:数据流属性名说明cmd设备云为获取数据定期下发访问寄存器的命令,用十六进制标示如"83A245"表示三个字节的命令0x83A245formula可选配置对命令返回各个寄存器值的处理公式,多个公式用分号间隔例如: "
1、2、…、n,分别表示第1、2、…、n个计算公式A0、A1、…、An, 分别表示第1、2、…、n个寄存器值例如:
其中,通过restfull api主动下发的命令,尽量与数据流中定时下发的命令保持不同方法POSTURL/cmds头部api-key:xxxx-ffff-zzzzz,必须master keyURL参数device_id = //接收该数据的MODBUS设备ID,必填内容{"cmd":"xxxxxxxx" //需要下发MODBUS设备的命令〔16进制字符串}成功返回{"errno": 0,"error":"succ","data":{//不超过64个字符字符串"cmd_uuid":"2302-312-FWs"}}查看命令发送状态方法GETURL/cmds/
方法GETURL/cmds/< cmd_uuid >/resp头部api-key:xxxx-ffff-zzzzz, 必须master key bodyMODBUS设备响应数据<二进制>响应的状态码对应的错误信息如下400No api-key403Auth Failed404Not Found400Invalid Parameter220Command Created221Command Sent520Send Command Failed200Command Response Received432Command Response Timeout433Command Response Too Large7 接入例子--命令03读取保持寄存器〔以下截图来自《MODBUS协议.pdf》1. 利用restfull api创建设备User-Agent: Fiddlerapi-key: nCxNdCoX6eHGfergpyytu66TyuY= /*必须为MasterKey*/注意长度和空行,建议使用fiddler调试,会自动填充长度Content-Length: 155{ "title":"12345670",/*填写MODBUS设备卡号*/ "desc":"test modbus", "private":true, "protocol":"",/*填写协议,没有专门的Modbus协议*/ "auth_info":{"12345670":"12345670"},/*这里就是鉴权信息的卡号和密码,长度有限制,参考登录报文格式*/ "interval":20 /*命令的查询间隔*/}此api没有针对modbus相关配置出错处理返回,必须仔细填写各个字段。
2. 为该设备创建数据流使用restfull api创建,请求数据如下:POST ://api.heclouds/devices/[your_devid]/datastreams /1.1User-Agent: Fiddlerapi-key: nCxNdCoX6eHGfergpyytu66TyuY= /*设备对应的key或masterkey*/注意长度和空行,建议使用fiddler调试,会自动填充长度Content-Length: 66{"id":"test_cmd","cmd":"1103006B00038776","interval":20}CMD字段解释如下:"1103006B00038776"对应的MODBUS RTU命令如下图所示:{0x11,0x03,0x0,0x6B,0x0,0x3,0x87,0x76},其中0x87和0x76存储的是CRC16结果0x8776,从Slave Address 0x11开始计算到最后一个寄存器地址<此处为0x3>3. 上传登录报文如前述登录报文格式,例子如下:unsigned char req[52];unsigned char type[11] = "type"; unsigned char name[9] = "name"; unsigned char phone[12] = "12345670";//填写创建设备时的卡号 unsigned char pwd[9] = "12345670";//填写创建设备时的密码 unsigned char p_id[11] = "47434";//modbus设备所在项目的ID memset
Raw数据如下:0x74 0x79 0x70 0x65 0x0 0x0 0x0 0x0 0x0 0x0 0x00x6e 0x61 0x6d 0x65 0x0 0x0 0x0 0x0 0x0 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x30 0x0 0x0 0x0 0x0 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x30 0x0 0x33 0x39 0x34 0x38 0x34 0x0 0x0 0x0 0x0 0x0 0x0。
