系统调用接口的适配以及使用
本节主要是在移动提供的系统调用函数接口的基础上,补全函数内的实体,在后续的开发中需要使用这些接口来完成相关的开发工作。比如创建消息队列,获取当前系统时间,锁的创建使用及释放等等。本章只提供常用的相关的函数接口,具体的参数以及使用请详看V150 SDK的函数说明。
消息队列的相关接口
创建消息队列
1 |
osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr); |
删除消息队列
1 |
osStatus_t osMessageQueueDelete (osMessageQueueId_t mq_id); |
向消息队列中发送消息
1 |
osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout); |
从消息队列中获取消息
1 |
osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout); |
系统时间及定时器相关接口
获取当前时间
1 2 3 4 5 |
time_t get_current_time(void); //单位是s uint64 get_current_time_ms(void);//单位是ms osStatus_t osDelay (uint32_t ticks);//时延函数,单位ms |
RTC定时器相关接口
1 2 3 4 5 6 7 |
rtc_handle rtc_add_ms(uint32 callback_delay, rtc_timer_callback callback_func, RTC_FLAG flag);//添加定时器,单位是ms rtc_handle rtc_add_s(uint32 callback_delay, rtc_timer_callback callback_func, RTC_FLAG flag); //添加定时器,单位是s rtc_status rtc_stop(rtc_handle timer_id);//停止RTC定时器 rtc_status rtc_delete(rtc_handle timer_id);//删除RTC定时器 |
软中断定时器的相关接口
1 2 3 4 5 6 7 8 9 |
osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr);//创建定时器 osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks);//启动定时器 osStatus_t osTimerStop (osTimerId_t timer_id);//停止定时器 uint32_t osTimerIsRunning (osTimerId_t timer_id);//判断定时器是否正在运行中 osStatus_t osTimerDelete (osTimerId_t timer_id);//删除定时器 |
线程相关接口
创建新的线程
1 |
osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr); |
锁的相关函数接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
1、创建锁 osMutexId_t osMutexNew (const osMutexAttr_t *attr); 2、获取锁 osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout); 3、释放锁 osStatus_t osMutexRelease (osMutexId_t mutex_id); 4、删除锁 osStatus_t osMutexDelete (osMutexId_t mutex_id); |
内存分配相关接口
1、申请内存
1 2 3 |
memp_malloc(size) //size是所要申请的内存块大小,以字节为单位 irmalloc (n, size) //要申请n块内存,每块内存区大小为size字节 |
2、内存释放
1 |
irfree(mem) //mem是申请内存时返回的指针 |
FLASH及KV操作相关接口
1、FLASH相关接口
1 2 3 4 5 6 7 |
NEUL_RET neul_update_package_get_available_flash(uint32 *available_size)//获取可用的flash空间 NEUL_RET neul_update_package_allocate_flash(uint32 update_package_size, bool *allocated); //为FOTA包申请一块flash空间 NEUL_UPDATE_RET ota_package_download(uint32 offset, const uint8 * buff, uint16 len, OTA_FLASH_WRITE_DONE_CB callback);//下载数据包到外置的flash bool ota_iflash_write(uint8* buffer, uint32 offset, uint16 length, OTA_FLASH_WRITE_DONE_CB done_callback);//将数据包写入内置flash中 |
2、KV操作相关接口
1 2 3 4 5 6 7 |
NEUL_RET neul_kv_set(neul_kv_key key, const uint8 *kvalue, uint16 kvalue_length); //设置KV项中的值 NEUL_RET neul_kv_get(neul_kv_key key, uint16 kvalue_max_length, uint16 *kvalue_length, uint8 *kvalue);//获取KV项中的值 注:新增的KV项定义在src\config\keys\application_core下的相关文件中。 |
LOG打印接口
1 |
void log_event_string(log_module_id_t module, log_verbosity_t verbosity, log_flags_t kv_flags,log_message_id_t id, const char *str, ...); |
网络接口层的适配以及使用
这里主要是说明我们正在使用的网络接口层部分函数的使用,在适配OneNET平台的时候,可能需要使用下面的函数来完成相关接口的补全,后续的开发中需要使用这些接口来完成相关功能的实现。本章只提供常用的相关的函数接口,具体的参数以及使用请详看V150 SDK的函数说明。
3.1 SOCKET相关接口的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
3.1.1 创建socket int socket(PROTOCOL_FAMILY domain, SOCKET_TYPE type, PROTOCOL_TYPE protocol); 3.1.2 关闭socket int close_socket(int socket); 3.1.3 绑定socket的接收数据回调函数 int neul_bind(int socket, const struct sockaddr *sock_address, socklen_t sock_len, socket_recv_notify_fn socket_notify); 3.1.4 设置socket发送完数据的回调 NEUL_RET sock_callback_set(int sock_num, socket_sent_notify_fn socket_sent_notify_callback, socket_status_notify_fn socket_status_notify_callback) 3.1.5 发送数据接口 ssize_t sendto_with_indication(int socket, uint8 seq_num, const void *message, size_t length, SOCK_MSG_FLAG flags, const struct sockaddr *dest_addr, socklen_t dest_len); ssize_t sendto(int socket, const void *message, size_t length, SOCK_MSG_FLAG flags, const struct sockaddr *dest_addr, socklen_t dest_len); 3.1.6 数据接收接口 ssize_t recvfrom(int socket, void *buffer, size_t length, SOCK_MSG_FLAG flags, struct sockaddr *src_addr, socklen_t src_len); |
3.2 IP地址相关函数
IP地址的函数比较简单,都是一些宏定义接口,定义在neul_ip_addr.h文件中,需要使用的话可以查阅。
相关AT命令实现及使用
本章主要是说明中移提供的相关AT接口的功能以及相关参数的说明,在进行适配OneNET平台的时候,需要使用上面两章完成的相关接口来完成各个AT命令的具体实现,后续的交互过程主要是通过这些AT命令来实现。
在SDK中添加新的AT命令流程如下:
1、在app_at_cmd_parse.c文件中的g_at_cmd_table[]数组中添加对应的AT命令,其中新添加的AT命令结构如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
typedef struct { AT_FLAG flag; //设置AT命令的属性 char *cmd_str; //AT命令的名称 at_cmd_set at_set_handler;//AT命令的参数设置函数 at_cmd_read at_read_handler;//AT命令参数读取函数 at_cmd_test at_test_handler;//AT命令测试函数 at_cmd_exec at_exec_handler;//AT命令执行函数 }AT_CMD_CB_s; |
2、在对应的*.c文件中实现相对应的各个AT函数,如果没有的话写NULL。
创建一个SDK的实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
AT+MIPLCREATE=<totalsize>, <config>, <index>, <currentsize>, <flag> 参数: <totalsize>:config文件的总长度 <config>:配置文件 <index>:配置文件的序号,考虑到AT指令长度有限,一个完整的配置文件未必能在一条AT指令中发送完成,可以将内容切分成多段,比如分为N段,则从前到后按照降序依次分配序号为N-1~0,按照从大到小序号的顺序每段调用一次AT指令,如此当index为0时意味着该条指令为最后一条配置消息 <currentsize>:当前指令所包含的配置文件长度 <flag>:消息标识 1:第一条消息 2:中间消息 0:最后一条消息 返回值: <CR><LF>OK<CR><LF>:如果发送的是index不为0的消息,该回复代表消息正确接收 <CR><LF><ref><CR><LF>:如果发送的是index为0的消息,该回复代表消息正确接收,且返回一个创建完成的SDK的一个实例标识,类型为一个无符号整数 <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
删除一个SDK的实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
AT+MIPLDELETE=<ref> 参数: <ref>:SDK的一个实例标识,类型为一个无符号整数 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 向平台发起注册请求 AT+MIPLOPEN=<ref> 参数: <ref>:SDK的一个实例标识,类型为一个无符号整数 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
向平台发起注销请求
1 2 3 4 5 6 7 8 9 10 11 |
AT+MIPLCLOSE=<ref> 参数: <ref>:SDK的一个实例标识,类型为一个无符号整数 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
向设备添加object
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
AT+MIPLADDOBJ=<ref>,<objectid>, <instancecount>, <instancebitmap>,<attributecount> 参数: <ref>:SDK的一个实例标识,类型为一个无符号整数 <objectid>:对象id <instancecount>:实例个数 <instancebitmap>:实例位图 <attributecount>:属性个数 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
删除object
1 2 3 4 5 6 7 8 9 10 11 12 13 |
AT+MIPLDELOBJ=<ref>,<objectid> 参数: <ref>:SDK的一个实例标识,类型为一个无符号整数 <objectid>:对象id 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
通知平台一个数值变化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
AT+MIPLNOTIFY=<ref>, <msgid>, <objectid>, <instanceid>, <resourceid>, <valuetype>, <len>, <value>, <index>,<flag> 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <msgid>:消息id <objectid>:对象id <instanceid>:实例id <resourceid>:资源id < valuetype >:发送的数据类型 < len >:发送的数据长度 <flag>:消息标识 1:第一条消息 2:中间消息 0:最后一条消息 发送的数据类型要求如下: string =1,//字符串型 opaque=2,//不透明类型 integer=3,//整型 float=4,//浮点型 bool=5,//布尔型 <len>:读取的数据长度 <value>:发送的数据值 <index>:指令序号。若某个Notify操作需要N条消息组合为一完整指令,则index从N-1至0降序编号,当index编号为0时表示本次Notify指令结束 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
读取资源值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
AT+MIPLREADRSP=<ref>, <msgid>, <objectid>, <instanceid>, <resourceid>, <valuetype>, <len>, <value>, <index>, <flag> 用户接到+MIPLREAD消息后,需要去读取需要的资源的值,读取到需要的值,用户使用该指令将读取到的值一条一条发给SDK,将msgid置为收到的+MIPLREAD的消息携带的msgid。 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <msgid>:消息id <objectid>:对象id <instanceid>:实例id <resourceid>:资源id < valuetype >:发送的数据类型 发送的数据类型要求如下: string =1,//字符串型 opaque=2,//不透明类型 integer=3,//整型 float=4,//浮点型 bool=5,//布尔型 <len>:读取的数据长度 <value>:发送的数据值 <index>:指令序号。若某个Read操作需要N条消息组合为一完整指令,则index从N-1至0降序编号,当index编号为0时表示本次Read指令结束 <flag>:消息标识 1:第一条消息 2:中间消息 0:最后一条消息 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
写入资源值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
AT+MIPLWRITERSP=<ref>, <msgid>, <result>, <index> 该指令通知SDK写入的消息结果。用户接到+MIPLWRITE消息后,需要去写入需要的资源的值,同时使用该消息通知SDK写入的结果。调用该命令时将msgid置为对应+MIPLWRITE消息携带的msgid。 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <msgid>:消息id <result>:写入操作的结果;“0”代表写入错误,“1”代表写入正确 <index>:对应+MIPLWRITE消息的指令序号 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
执行请求的动作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
AT+MIPLEXECUTERSP=<ref>, <msgid>, <result> 该指令通知SDK执行操作的结果。用户接到+MIPLEXECUTE消息后,需要去执行请求的动作,同时使用该消息通知SDK执行的结果。调用该命令时将msgid置为对应+MIPLEXECUTE消息携带的msgid。 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <msgid>:消息id <result>:写入操作的结果;“0”代表执行错误,“1”代表执行正确 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
验证观测指令是否有效
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
AT+MIPLOBSERVERSP=<ref>, <msgid>, <result> 该指令通知SDK观测指令是否有效。当应用程序收到+MIPLOBSERVE消息后,需要去验证该请求是否有效。调用该命令时将msgid置为对应+MIPLOBSERVE消息携带的msgid。 参数: <ref>:基础通信套件的一个标识,类型为一个无符号整数 <msgid>:消息id <result>:观测消息是否有效:“0”代表请求无效,“1”代表请求有效 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
回复指定object的所有属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
AT+MIPLDISCOVERRESP=<ref>, <msgid>, <length>,<valuestring> 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <msgid>:消息id <length>:返回valuestring的长度 <valuestring>:object的属性要求,多个属性之间使用逗号“,”隔开"1101,1102,1103" 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
读取请求消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
AT+MIPLREAD: <ref>, <msgid>, <objectid>, <instanceid>, <resourceid>, [<count>] 如果resourceid =‘-1’,则该指令会携带count 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <msgid>:消息id,标识该读取请求消息 <objectid>:对象id <instanceid>:实例id <resourceid>:资源id,如果为‘-1’,则代表需要读取该instance下的所有资源 <count>:需要读取的资源数 返回值: 无 |
写操作请求消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
AT+MIPLWRITE: <ref>, <msgid>, <objectid>, <instanceid>, <resourceid>, <valuetype>, <len>, <value>, <index> 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <msgid>:消息id,标识该写入请求消息 <objectid>:对象id <instanceid>:实例id <resourceid>:资源id < valuetype >:待写入的数据类型 待写入的数据类型要求如下: string =1,//字符串型 opaque=2,//不透明类型 integer=3,//整型 float=4,//浮点型 bool=5,//布尔型 <len>:待写入的数据长度 <value>:待写入的数据值 <index>:指令序号。若某个Write请求需要N条消息组合为一完整指令,则index从N-1至0降序编号,当index编号为0时表示本次Write请求结束。 返回值: 无 |
执行操作请求消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
AT+MIPLEXEUTE: <ref>, <msgid>, <objectid>, <instanceid>, <resourceid> 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <msgid>:消息id,标识该执行请求消息 <objectid>:对象id <instanceid>:实例id <resourceid>:资源id 返回值: 无 |
观测请求消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
AT+MIPLOBSERVE: <ref>, <msgid>, <flag>,<objectid>, [<instanceid>], [<resourceid>] 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <msgid>:消息id,标识该观测请求消息 <flag>: 1 为添加观测,0 为取消观测 <objectid>:对象id <instanceid>:实例id,如果为‘-1’,则代表观测该object下所有instance下的所有资源 <resourceid>:资源id,如果为‘-1’,则代表观测该instance下的所有资源 返回值: 无 |
设置策略参数请求消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
AT+MIPLPARAMETER: <ref>, <msgid>, <objectid>, <instanceid>, <resourceid>, <parameter>, <len> 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <msgid>:消息id,标识该观测请求消息 <objectid>:对象id <instanceid>:实例id, 如果为‘-1’,则代表观测该object下所有instance下的所有资源 <resourceid>:资源id,如果为‘-1’,则代表观测该instance下的所有资源 <parameter>:策略参数,格式为字符串形式 包括如下策略: pmin=xxx; pmax=xxx; gt=xxx; lt=xxx; stp=xxx <len>:参数长度 返回值: 无 |
通知SDK发送主动更新注册信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
AT+MIPLUPDATE=<ref>,<lifetime>,<withObjectFlag> 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <lifetime>:更新的lifetime值,单位为ms,如果为0则表示使用默认的lifetime值 <withObjectFlag>:是否需要同时更新注册的Object对象 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
通知mcu需要获取指定object的属性
1 2 3 4 5 6 7 8 9 |
AT+MIPLDISCOVER:<ref>, <msgid>, <objectid> 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <msgid>:消息id <object>:指定的object对象id |
获取SDK版本
1 2 3 4 5 6 7 |
AT+MIPLVER? 参数:无 返回值: <CR><LF><version><CR><LF>:SDK的版本号 |
上报错误消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
AT+MIPLERROR: <ref>, <msgid>, <errid> 参数: <ref>:SDK的一个标识,类型为一个无符号整数 <msgid>:引发错误的消息id <errid>:错误id(可扩充) 0:未知错误 1:系统错误 2:网络异常 3:注册失败 返回值: <CR><LF>OK<CR><LF> <CR><LF>+CIS ERROR: <errid><CR><LF>:返回错误。 |
文章评论