本帖最后由 flyingbing 于 2015-11-10 17:56 编辑
1.dts
配置
在这里我们控制的是
wled,
修改
dts,
将其配置为普通
IO,
可参考
2.用户空间控制
led
在这里我们简单的通过
gpio
子系统在用户空间对
gpio
进行控制,
wled
的
gpio
号为
44,
控制步骤如下:
a. 将其导出到用户空间
echo 44 > /sys/class/gpio/export
b. 将其设置为输出模式
echo out > /sys/class/gpio/gpio44/direction
c. 设置
gpio
的值:
echo v > /sys/class/gpio/gpio44/value
在这里
v=1
时
led
为
off
状态,
v=0
时
,led
状态为
on
状态
.
3. 代码实现
Coap
协议就不多说了,在这里我们安装的是
libcoap,
库文件及应用代码见
package.tgz
部分代码如下
- int
- main(int argc, char **argv) {
- coap_context_t *ctx;
- fd_set readfds;
- struct timeval tv, *timeout;
- int result;
- coap_tick_t now;
- coap_queue_t *nextpdu;
- char addr_str[NI_MAXHOST] = "::";
- char port_str[NI_MAXSERV] = "5683";
- int ret = 0;
- pthread_t nty_thread;
- coap_log_t log_level = LOG_DEBUG;
- coap_set_log_level(log_level);
- ctx = get_context(addr_str, port_str);
- if (!ctx)
- return -1;
- init_resources(ctx);
- /* init the led control struct */
- led_control.ctx = ctx;
- pthread_mutex_init(&led_control.mutex, NULL);
- pthread_cond_init(&led_control.cond, NULL);
- led_control.wait = 1;
- ret = system("echo 44 > /sys/class/gpio/export");
- if (ret != 0) {
- perror("export gpio 44");
- }
- ret = system("echo out > /sys/class/gpio/gpio44/direction");
- if (ret != 0) {
- perror("set gpio 44 direction");
- }
- ret = system("echo 1 > /sys/class/gpio/gpio44/value");
- if (ret != 0) {
- perror("set gpio 44 value");
- }
- signal(SIGINT, handle_sigint);
- ret = pthread_create(&nty_thread, NULL, coap_notify_routine, NULL);
- if (0 != ret) {
- return -1;
- }
- while ( !quit ) {
- FD_ZERO(&readfds);
- FD_SET( ctx->sockfd, &readfds );
- nextpdu = coap_peek_next( ctx );
- coap_ticks(&now);
- while (nextpdu && nextpdu->t <= now - ctx->sendqueue_basetime) {
- coap_retransmit( ctx, coap_pop_next( ctx ) );
- nextpdu = coap_peek_next( ctx );
- }
- if ( nextpdu && nextpdu->t <= COAP_RESOURCE_CHECK_TIME ) {
- /* set timeout if there is a pdu to send before our automatic timeout occurs */
- tv.tv_usec = ((nextpdu->t) % COAP_TICKS_PER_SECOND) * 1000000 / COAP_TICKS_PER_SECOND;
- tv.tv_sec = (nextpdu->t) / COAP_TICKS_PER_SECOND;
- timeout = &tv;
- } else {
- tv.tv_usec = 0;
- tv.tv_sec = COAP_RESOURCE_CHECK_TIME;
- timeout = &tv;
- }
- result = select( FD_SETSIZE, &readfds, 0, 0, timeout );
- if ( result < 0 ) { /* error */
- if (errno != EINTR)
- perror("select");
- } else if ( result > 0 ) { /* read from socket */
- if ( FD_ISSET( ctx->sockfd, &readfds ) ) {
- coap_read( ctx ); /* read received data */
- }
- } else { /* timeout */
- }
- }
- system("echo 44 > /sys/class/gpio/unexport");
- coap_free_context(ctx);
- return 0;
- }
复制代码
4.程序测试
.
默认的端口号为
5683
,安装好插件后在火狐浏览器中输入
coap://192.168.8.1:5683
,然后点击
discovery,
会发现
led
的资源,如下图所示
其支持
get/put/observer
(订阅)方法
.
a. put
可以改变
led
的状态,输入文本
led_on
或
led_off
即可控制
led.
b. Get
获取
led
状态
c. Observer
订阅
led
状态,即当订阅
led
资源后,
led
的状态变化则其后收到变化通知
..
注意: 在选择
observe
前,先设置
behavior
选项,其中的
block
项选择如下图所示,如果选择其他的选项请求观察会返回错误,好像是版本变更的缘故,不支持
block option.
最终的效果如下,浏览器打卡两个窗口,也可多个,其中一个用来配置
led
的状态,其他的可以选择观察者模式(选择
led
资源,点击
observe
选项),当
led
的状态改变时,其他的观察者就会收到
led
的状态变更通知
,
如下图所示
0
|