百度API文档网址为:http://yuyin.baidu.com/docs/asr/57


百度识别出现参数错误:3300 输入参数不正确

可能原因:
1、base64EncodedStringWithOptions(.Encoding64CharacterLineLength)会加”\r\n”

2、Alamofire 的JSON会把”/”转义成”\/”


如何实现呢?

方法一:使用BASE64编码

要自己构造JSON,不能用NSJSONSerialization…然后网络请求库用其他的,太麻烦>_<

方法二、不使用BASE64编码

获取token

调用API

 

 

 

两台不加入域的主机,进行复制只能使用证书。

两天主机在一个工作组里。

复制makecert.exe到电脑,这个文件可以在安装了VS的电脑里找到。

 

在主服务器上

在副本服务器上

将文件 ReplicaTestRootCA.cer 从副本服务器复制到主服务器,然后使用以下命令将其导入:

将文件 PrimaryTestRootCA.cer 从主服务器复制到副本服务器,然后使用以下命令将其导入:

取消吊销检查

开启防火墙Hyber-V的有关端口

win+r 输入 mmc 设置后可以管理本地证书

iBeacon是Apple公司2013年9月提出的基于低功耗蓝牙( BLE)的标签广播技术。

同RFID类似,iBeacon技术包含 device和beacon(信标或基站),device相当于reader,beacon相当于tag。只不过beacon采用的是有源主动广播的方式,能够被多个device接收,device接收到的是三级标识符( UUID+ Major+ Minor)和RSSI(Received Signal Strength Indication接收的信号强度指示)。

iBeacon的优点:

1、低功耗

2、价格低廉

3、定位精度较高

4、与移动互联网连接紧密,O2O典型应用

 

注意,beacon只是告知device自己的标识符,device接收到标识符,根据标识符进行相应操作,比如页面显示和数据交换都是在device上进行的,查询数据库等也是查询device本机或者网络服务器的,和beacon无关。因此device一定需要配套的APP(或系统自带的iBeacon应用)。微信提供的摇一摇周边就是一个APP的例子。Google提出了Eddystone与iBeacon竞争。

beacon只不过是利用BLE协议中的Advertising数据包发送标识符,因此beacon可以是各种厂商的专用硬件设备,也可以是移动设备+带beacon功能的APP。

 

参考资料:

1、iBeacon协议

http://blog.csdn.net/qinxiandiqi/article/details/39004337

http://blog.csdn.net/qiank10/article/details/38050717

http://stackoverflow.com/questions/18906988/what-is-the-ibeacon-bluetooth-profile

https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html#//apple_ref/doc/uid/TP40013257-CH1-SW1

 

2、iBeacon介绍

https://developer.apple.com/ibeacon/

http://www.cctime.com/html/2014-11-4/201411411115005.htm

http://www.zhihu.com/question/32708729

 

3、国内公司

如苏州寻息、微位(上海)、重庆智石等等,非常多

 

 

 

这个还是有点没明白,这里先简单记录下。

注意,MySql如果不加索引,LEFT JOIN有点慢。

需求:对x_id分组,取最新的一个值。

MySql的写法,利用子查询先排序,然后GROUP BY后查询默认会取出每组第一条数据。

SELECT * FROM (SELECT db_1.id,db_1.r_id,db_1.x_id AS seat_id,db_1.time AS time,db_1.p_state, db_2.name AS name FROM db_1 LEFT JOIN db_2 ON db_1.match_id=db_2.match_id WHERE x_id <> ‘0000000000000000’ AND r_id =‘1’ ORDER BY db_1.id DESC) AS t GROUP BY t.seat_id

SQL Server下面的也能用,但是我么看懂。

SELECT A.r_id,A.x_id AS seat_id,A.time AS time,A.p_state, db_2.name AS name FROM db_1 AS A LEFT JOIN db_2 ON A.match_id=db_2.match_id WHERE 1>(SELECT COUNT(1) FROM db_1 AS B WHERE A.x_id=B.x_id AND A.ID<B.ID) AND x_id <> ‘0000000000000000’ AND r_id =‘1’ ORDER BY A.ID DESC

 

下面收集了一些资料,供参考:

MySQL 先排序再分组的问题 http://wenku.baidu.com/link?url=PsAGxhJY5ycK4Jk92crVEa-D60blwBiWFsY1ELrKkJxJzNW1XG-XAOdC7hFBW4NIN5ptB2oNlNQow1sWgPwwfF3aw8C0Wuq6-z3uaYfgc3y
mysql分组取每组前几条记录(排序) http://blog.sina.com.cn/s/blog_4c197d420101e408.html
left join on 和where条件的放置 http://blog.csdn.net/muxiaoshan/article/details/7617533
mysql 分组后取每个组内最新的一条数据(组内排序以及limit)http://www.dewen.io/q/12364/
How to select the first/least/max row per group in SQL http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

异地数据库如何同步?

最近有一个SQLserver和MySql的同步需求,看了一些资料。

0、直接备份

备份时候,Destination全删,重新从Source复制,简单粗暴,适合数据不大的情况。

1、简单备份

Source数据只增不删不改,且有自增ID,Destination只需要查询ID之差在应用层上编写查询和写入语句。

2、基于Trigger

基于trigger的方式获取增量变更,CRUD触发。

一种基于触发器的数据同步系统的研究及关键技术实现

3、基于日志

基于数据库的日志解析,获取增量变更进行同步。

数据库同步可以认为是同步操作记录,CRUD的每个记录如果被日志记录,在Destination只要重新执行一遍日志即可。

例如canal 是阿里巴巴mysql数据库binlog的增量订阅&消费组件。

https://github.com/alibaba/canal

4、一些软件,几乎都要收费

SyncNavigator $(不再更新?)***

SymmetricDS(免费的没有UI)

RedGate $

Sql Delta $

D-Softs $

SQLITE-SYNC

https://convertdb.com/

 

5、求大神指点

如何最简单从SQLserver同步到MySql呢?

MySql主从貌似很简单的样子 http://369369.blog.51cto.com/319630/790921

使用STM32中断来捕获输入信号频率,定周期数个数

进入中断时,首先应该读取数值,因为进入中断后,马上第二个中断就开始计时

如果不马上读取,即使多了一句话,测量的时间就不准了

LaunchPad G2553 低功耗测量
手册里写G2553最低功耗在 LPM3下有0.7-0.9uA
注意默认LaunchPad没有加晶振
所以为了达到这个目的:

1、所有管脚输出低电平
2、ACLK设置为VLOCLK,不设置会有5uA左右

直接用万用表串联测量J3跳线的VCC引脚,实测有0.7uA

01 #include “msp430.h”
02
03 int main( void )
04 {
05 /* Stop watchdog timer to prevent time out reset */
06    WDTCTL = WDTPW + WDTHOLD;
07
08 /* ACLK设置为VLOCLK */
09    BCSCTL3 |= LFXT1S_2;
10
11    P1DIR    = 0xFF;                 /* All P1.x outputs */
12    P1OUT    = 0;                    /* All P1.x reset */
13
14    P2DIR    = 0xFF;                 /* All P2.x outputs */
15    P2OUT    = 0;                    /* All P2.x reset */
16
17 /* 定时器配置 */
18    CCTL0    = CCIE;
19    CCR0    = 50000;
20    TACTL    = TASSEL_1 + MC_2;      /* ACLK, contmode */
21
22 /* 进入低功耗LPM3 */
23    __bis_SR_register( LPM3_bits + GIE );
24 }
25
26
27 #pragma vector=TIMER0_A0_VECTOR
28 __interrupt void Timer_A( void )
29 {
30    P1OUT |= BIT0;
31    __delay_cycles( 50000 );
32    P1OUT &= ~BIT0;
33 }

1、APM
http://diydrones.com/
主控芯片:ATMEGA2560

2、PX4
https://pixhawk.org
主控芯片:168 MHz Cortex M4F CPU (256 KB RAM, 2 MB Flash) / STM32F427

3、Crazyflie

Frontpage


主控芯片:STM32F4

4、MultiWii/MWC(MultiWii Copter)

http://www.multiwii.com/
主控芯片:ATMEGA/Arduino

5、AutoQuad 德国

Home


https://viacopter.eu/
主控芯片:STM32F405

6、MikroKopters 德国
http://www.mikrokopter.de/en/home

7、Crazepony 中国
http://www.crazepony.com/
主控芯片:72MHz的32位Cortex-M3架构处理器STM32

8、匿名四轴 中国
http://www.anotc.com/
主控芯片:STM32F103 72M

9、KK
官网不详

参考资料:
http://www.arduino.cn/thread-8430-1-1.html
http://www.zhihu.com/question/24312316

在学习STM32的ADC和DMA时候,发现了很多有意思的事情,这里记录一下,网上的很多回答不是很好。

1、DMA_BufferSize到底是什么?

Specifies the buffer size, in data unit, of the specified Channel. The data unit is equal to the configuration set in DMA_PeripheralDataSize or DMA_MemoryDataSize members depending in the transfer direction

其实,这个缓冲区概念不是很准确,准确的应该是每次DMA传输的数据数量。在库函数stm32f10x_dma.c中可以找到:

DMAy_Channelx->CNDTR = DMA_InitStruct->DMA_BufferSize;

那这个 CNDTR 是什么呢?在STM32参考手册里有说明, Number of data to be transferred (0 up to 65535). The transfer stops once the DMA_CNDTRx register reaches zero. 它就是一个计数器,这个计数器的值就是DMA_BufferSize,每传送一个数据就减一,变成0的时候,从ADC外设到内存的传输(或相反)停止。此时可产生中断信号。假设DMA_BufferSize=10,那么ADC采集10次后,DMA就停止传输ADC的采集数据了。

那为啥取名叫buffer 呢,我猜是为了和DMA_MemoryInc_Enable配合。虽然传输计数是减少的,但是内存地址是增长的。在声明DMA_MemoryBaseAddr时候,其实DMA的就指向(是指向,不是开辟!)一个大小为DMA_BufferSize的数组,数组的开始地址为DMA_MemoryBaseAddr。这个数组就是缓冲区。

每次ADC采样后,就通过DMA把数据放在内存中,从DMA_MemoryBaseAddr+0地址开始放,直到DMA_MemoryBaseAddr+DMA_BufferSize-1,此时CNDTR变成0,传输结束。

2、DMA_BufferSize的大小应该取多少?

上面的讨论很多同学就疑惑了,这个大小应该取多少呢?暂时我建议你需要多少数据就写多少。

__IO uint16_t ADC_ConvertedValue[NUM];

一般,我们会定义一个变量存我们的数据,然后

DMA_InitStruct.DMA_BufferSize = NUM;

DMA_InitStruct.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;

这时候,缓冲区的大小和我们定义的数组一致,也方便我们操作。

但是如果DMA_BufferSize大于NUM会怎么样?根据上面问题1的解释,缓冲区地址其实就是我们的ADC_ConvertedValue地址,如果DMA_BufferSize为NUM+N,其实缓冲区就是ADC_ConvertedValue[NUM+N],再说一遍,Buffer的首地址和ADC_ConvertedValue相同,如果我们用指针访问,可以很好的验证。

__IO uint16_t *p;
p=ADC_ConvertedValue;

////省略代码,printf是串口通信改写的函数….

printf(“%4x\n”,ADC_ConvertedValue[NUM-1]);
printf(“%4x\n”,*(p+NUM));

printf(“%4x\n”,*(p+NUM+1));

你会很吃惊的发现,*(p+NUM)里面也有我们采样的数据。如果我们用ADC_ConvertedValue[NUM]访问则会出错,因为超出数组范围了。也就是说DMA_BufferSize可以大于NUM,但是大于NUM的地址属于不被定义的内容。从编程角度,它使用了未知的区域,如果这个地址定义别的变量,那么就会误操作这个变量。

__IO uint16_t ADC_ConvertedValue[NUM];
__IO uint16_t a[N];

比如我们定义时候,紧跟ADC_ConvertedValue定义一个a;一般编译器会把这两个变量的地址连在一起。那么在运行程序时候:

printf(“%4x\n”,ADC_ConvertedValue[NUM-1]);
printf(“%4x\n”,*(p+NUM));

printf(“%4x\n”,ADC_ConvertedValue[NUM-1]);
printf(“%4x\n”,a[0]);

是一样的数据。

很危险吧。a[0]的数据就被DMA覆盖了。

 

3、ADC多通道DMA的真正采样顺序是什么?

很多同学想ADC多通道采样,比如两个通道,每个通道采10次。那么,到底是先把通道1采集10次,再轮到通道2采集10次。还是通道1和2轮流采集,第一次,先通道1,再通道2。第二次,先通道1,再通道2。直到第10次。这里假设的通道1比通道2优先级高。

很简单,ADC手册里写了,是通道1和2轮流采集。

你也可以做个实验,定义ADC_ConvertedValue[NUM],把两个通道接到不同电平,然后依次输出ADC_ConvertedValue[i],很明显可以看到数值交替。

4、ADC多通道内存数组为何定义为?

一般我们定义二维数组来存放采集的数据。如:

ADC_ConvertedValue[Sample_Num][Channel_Num]

那么为啥是这么写呢?不能是ADC_ConvertedValue[Channel_Num][Sample_Num]吗?

这个翻翻C语言的教材,C数组是按行存储的。加上ADC是轮流采样通道的,因此ADC_ConvertedValue[Sample_Num][Channel_Num]刚好每一列都是通道采样值。

 

5、DMA_Mode 的DMA_Mode_Circular与DMA_Mode_Normal 区别?

DMA_Mode_Normal ,普通模式: 在DMA传输结束时, DMA通道被自动关闭,进一步的DMA请求将不被满足。也就是说当传输结束时候,DMA就不工作了。要想工作要重新配置DMA。

DMA_Mode_Circular,循环模式:用于处理一个环形的缓冲区,每轮传输结束时数据传输的配置会自动地更新为初始状态, DMA传输会连续不断地进行。意思就是说,每次CNDTR变成0时候,就自动重新按照程序初始化时候的DMA配置再配置一遍。然后重新运行。

In circular mode, after the last transfer, the DMA_CNDTRx register is automatically reloaded

with the initially programmed value. The current internal address registers are reloaded with
the base address values from the DMA_CPARx/DMA_CMARx registers.

6、DMA中断时候,还在传数据吗?

DMA在循环模式时候,如果中断了,那么DMA还工作吗?答案是DMA仍然工作!

也就是说进入中断后,DMA还在传数据,ADC_ConvertedValue里的值还是变化的!

为什么?想想DMA是干什么的吧,中断是CPU的工作。DMA本来就和CPU没关系的。

 

未完…

Class ‘Home\Controller\QRcode’ not found

THINKPHP3.2 整合phpqrcode 生成二维码,QRcode::png不好用,解决方法如下:

 

<?php
public function qrcode($url){
//引入phpqrcode文件.源码放在vendor/qr文件夹里
vendor(“qr.phpqrcode”);
//纠错级别, 纠错级别越高,生成图片会越大
//L水平    7%的字码可被修正
//M水平    15%的字码可被修正
//Q水平    25%的字码可被修正
//H水平    30%的字码可被修正
$level = “L”;
//图片每个黑点的像素。
$size = “8”;
//生成图片 第二个参数:是否保存成文件 如需要保存文件,第二个参数改为文件名即可,如:’qrcode.png’
$qr = new \QRcode();
//p($url);die;
$qr->png($url, false, $level, $size);
}
?>