http://www.amazon.co.jp/%E3%83%90%E3%83%AB%E3%82%AF-USB%E6%B8%A9%E5%BA%A6%E8%A8%88-USB-thermometer/dp/B004FI1570
買ってみた。githubにlinux用のツールがあるので拝借。
GitHub - bitplane/temper: App to log the current temperature from a Temper1 sensor
一部FreeBSDではエラーになるので直して使っていたのだが、手元の環境では2,3日すると固まって温度が取れなくなる&プロセスも切れない。(USBバスが固まるのかシャットダウンもできない)な状態になる。
なんか、何度もオープンしたりクローズしたりするのがよくない感じっぽいので、libeventで簡単http鯖になってもらうことにした。
static usb_dev_handle *temperdev; int main(int argc, const char* argv[]) { struct event_base *ev_base; struct evhttp *httpd; ev_base = event_base_new(); httpd = evhttp_new(ev_base); if (evhttp_bind_socket(httpd,"127.0.0.1",PORT) < 0) { perror("evhttp_bind_socket()"); exit(1); } temperdev = temperopendev(); evhttp_set_gencb(httpd, req_handler, NULL); event_base_dispatch(ev_base); evhttp_free(httpd); event_base_free(ev_base); temperclosedev(temperdev); return 0; } void req_handler(struct evhttp_request *r, void *arg) { struct evbuffer *evbuf; char content_length[8]; char buf[128]; evbuf = evbuffer_new(); if (evbuf == NULL) { evhttp_send_error(r, HTTP_SERVUNAVAIL, "Failed to create buffer"); return; } snprintf(buf,128,"%f\n",gettemp(temperdev)); snprintf(content_length, 7, "%d", strlen(buf)); evhttp_add_header(r->output_headers, "Content-Type", "text/plain"); evhttp_add_header(r->output_headers, "Content-Length", content_length); evbuffer_add(evbuf, buf, strlen(buf)); evhttp_send_reply(r, HTTP_OK, "", evbuf); evbuffer_free(evbuf); }
なんかサンプルに毛が生えた程度だが、
何が来ても温度返すだけで安定した感じw。