我是否可以使用串行端口配置文件(SPP)通过蓝牙低功耗(v4.0)与iOS设备通信,而无需使用MFi芯片?
有没有人为iOS获得SPP通信(串行蓝牙)的示例代码?我需要在我的微芯片pic和iPhone或iPod之间进行通信.
我知道我需要一个批准的苹果蓝牙rs232 < - > BT加密狗,我也有一些与MFi合同;)
问候.
嘿所有,
据我所知,Android的蓝牙堆栈(bluez)已在4.2上被取代.即使他们可能已经修复了许多以前的问题,但由于需要支持旧版本,我仍然需要与它们进行斗争.
如果有人事先处理过这个问题并且可以解释一些问题,我将非常感激.
蓝牙应用程序连接到我们自己的自定义SPP设备(我们使用标准UUID).它使用蓝牙服务,运行在它自己的进程上.这个应用程序要求运行蓝牙工作几个小时.
在省电/屏幕锁定期间,应用程序在数据通过蓝牙无线电进入时保持活动状态,并且我还定期检查设置的警报,我请求CPU时间重新连接并继续工作(如果需要)
现在; 该系统工作正常的大部分时间,但是,在某些罕见的情况下,当屏幕被锁定,并在省电模式下,对于原因,我不明白,在写入到输出流(蓝牙接口),一切似乎都在没有检测到断开连接的情况下通过.spp设备仍然声明连接和配对有效但没有收到任何信息.
在Android方面,日志显示对BluetoothSocket.cpp :: writeNative的本机调用(假设它与bluez蓝牙堆栈直接相关),似乎只是将字节正确地写入蓝牙无线电而不报告任何类型的错误.
写入输出流的代码段:
public void write(byte[] bytes) {
try {
Log.d(LOGGER.TAG_BLUETOOTH," bluetooth bytes to write : "+bytes);
mmOutStream.write(bytes);
mmOutStream.flush();
Log.d(LOGGER.TAG_BLUETOOTH," bluetooth bytes written : "+bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
logcat:
D/com.our.app.bluetooth(8711):发送字节:[B @ 41e0bcf8
D/com.our.app.bluetooth(8711):要写的蓝牙字节:[B @ …
我使用Windows 7 PC作为服务器.码:
public class PCSPPServer {
//start server
private void startServer() throws IOException{
//Create a UUID for SPP
UUID uuid = new UUID("1101", true);
//Create the servicve url
String connectionString = "btspp://localhost:" + uuid +";name=Sample SPP Server";
//open server url
StreamConnectionNotifier streamConnNotifier = (StreamConnectionNotifier)Connector.open( connectionString );
//Wait for client connection
System.out.println("\nServer Started. Waiting for clients to connect...");
StreamConnection connection=streamConnNotifier.acceptAndOpen();
RemoteDevice dev = RemoteDevice.getRemoteDevice(connection);
System.out.println("Remote device address: "+dev.getBluetoothAddress());
System.out.println("Remote device name: "+dev.getFriendlyName(true));
//read string from spp client
InputStream inStream=connection.openInputStream();
BufferedReader …
Run Code Online (Sandbox Code Playgroud) 不幸的是,我的android蓝牙有一些问题.对于我的测试环境,我使用的是带有Android 4.4.2的Nexus 4.
我的PC上有一个Java应用程序,它使用bluecove作为客户端进行SPP连接.该程序正在寻找一个特殊的服务名称,并与我的Android手机连接.然后它发送72个字节到我的Android手机,并等待答案.得到答案时,程序会睡3秒钟而不是重新开始.
在我的Android手机上,我有一个带有后台蓝牙监听器的应用程序,它在启动时启动.此应用程序基于BluetoothChat示例演示.当接收蓝牙数据时,我检查传入的数据并发回答案.
一切正常.但是在489蓝牙连接之后,Android应用程序在PC-java-app正在进行时失败并显示以下错误代码:
getBluetoothService() called with no BluetoothManagerCallback
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x41b34ba8)
FATAL EXCEPTION: main
Process: de.tum.lme.diamantum:remote_blue, PID: 21567
java.lang.NullPointerException: FileDescriptor must not be null
at android.os.ParcelFileDescriptor.<init>(ParcelFileDescriptor.java:174)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:905)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:897)
at android.bluetooth.IBluetooth$Stub$Proxy.createSocketChannel(IBluetooth.java:1355)
at android.bluetooth.BluetoothSocket.bindListen(BluetoothSocket.java:349)
at android.bluetooth.BluetoothAdapter.createNewRfcommSocketAndRecord(BluetoothAdapter.java:1055)
at android.bluetooth.BluetoothAdapter.listenUsingRfcommWithServiceRecord(BluetoothAdapter.java:976)
at com.test.btconn.BluetoothHandling$AcceptThread.<init>(BluetoothHandling.java:449)
at com.test.btconn.BluetoothHandling.start(BluetoothHandling.java:216)
at com.test.btconn.BluetoothListenerService.setupBtSockets(BluetoothListenerService.java:330)
at com.test.btconn.BluetoothListenerService.manageBtState(BluetoothListenerService.java:249)
at com.test.btconn.BluetoothListenerService.setBtStateDisconnected(BluetoothListenerService.java:383)
at com.test.btconn.BluetoothListenerService.access$5(BluetoothListenerService.java:378)
at com.test.btconn.BluetoothListenerService$2.handleMessage(BluetoothListenerService.java:421)
Run Code Online (Sandbox Code Playgroud)
因此,应用程序的ParcelFileDescriptor存在问题,该问题突然变为空.但为什么?
当改变PC-java-app上的暂停时间时,使用各种数据大小来传输和使用不同的智能手机时,也会发生上述所有情况.当使用反射"listenUsingRfcommWithServiceRecord"时,505传输后也会发生相同的情况.使用唤醒锁也没有任何改变.
顺便说一下,使用BluetoothChat样本时我也有同样的行为.
所以,有人提示,会发生什么?
更新:
如果蓝牙状态为3,则每次连接后BluetoothServerSocket都会关闭,BluetoothSocket会关闭.
我遇到了一个特殊的问题(我想).对于一个研究项目,我必须制作一个可以连接到激光测距仪(Bosch GLM 50 C Distometer)的Android应用程序.到目前为止,我在Stackoverflow和其他来源处经历了无数的教程和提示.
我是Android的新手,并且不堪重负.任务是创建一个应用程序,该应用程序读取博世设备上的测量距离,并通过蓝牙在智能手机上显示/保存.
现在我的具体问题是:是否可以读取蓝牙设备发送的数据(例如2.083m)?任何建议如何实现?
我能够与设备建立连接,按照本教程我发现:
package com.test.bluetooth;
import java.io.DataInputStream;
public class Main_Activity extends Activity implements OnItemClickListener {
TextView measuredValue;
ArrayAdapter<String> listAdapter;
ListView listView;
BluetoothAdapter btAdapter;
Set<BluetoothDevice> devicesArray;
ArrayList<String> pairedDevices;
ArrayList<BluetoothDevice> devices;
public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
protected static final int SUCCESS_CONNECT = 0;
protected static final int MESSAGE_READ = 1;
IntentFilter filter;
BroadcastReceiver receiver;
String tag = "debugging";
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.i(tag, …
Run Code Online (Sandbox Code Playgroud) 我们即将发布我们软件的新版本,对于之后的版本,我们的目标是使我们的蓝牙SPP连接的连接过程更加可靠.我们在产品中使用RN42模块,目前有时可能需要多次尝试才能连接到我们的主板.
这是我目前的代码:
class ConnectThread extends Thread {
BluetoothDevice mDevice;
public ConnectThread(BluetoothDevice device) throws SecurityException, NoSuchMethodException {
mDevice = device;
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
try {
btSocket = mDevice.createInsecureRfcommSocketToServiceRecord(uuid);
} catch (IOException e) {
Log.e("Error", "Could not create socket!");
}
}
public void cancel() {
interrupt();
try {
Log.i("Treadmill", "in connect thread cancellation");
btSocket.close();
} catch (IOException localIOException) {
Log.e("Treadmill", "exception + " + localIOException.getMessage());
}
}
public void run() {
btAdapter.cancelDiscovery();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Log.e("whatever", …
Run Code Online (Sandbox Code Playgroud) 可能重复:
在Android上使用蓝牙的服务发现失败异常
好吧,过去两三天我一直在阅读很多话题,似乎没有人问过这个问题.
我正在为我的andriod设备编写PC端服务器,这是用于交换一些信息和一般调试.最终我将连接到SPP设备来控制微控制器.
我已经管理,使用以下(Android到PC)连接到rfcomm通道11并在我的Android设备和我的电脑之间交换数据.
方法m = device.getClass().getMethod("createRfcommSocket",new Class [] {int.class}); tmp =(BluetoothSocket)m.invoke(device,Integer.valueOf(11));
我尝试了createRfcommSocketToServiceRecord(UUID)方法,绝对没有运气.
对于PC端,我一直在使用C Bluez堆栈用于linux.我有以下代码注册服务并打开服务器套接字:
int main(int argc, char **argv)
{
struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 };
char buf[1024] = { 0 };
char str[1024] = { 0 };
int s, client, bytes_read;
sdp_session_t *session;
socklen_t opt = sizeof(rem_addr);
session = register_service();
s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
loc_addr.rc_family = AF_BLUETOOTH;
loc_addr.rc_bdaddr = *BDADDR_ANY;
loc_addr.rc_channel = (uint8_t) 11;
bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr));
listen(s, …
Run Code Online (Sandbox Code Playgroud) 多年来困扰我的事情.我使用了很多蓝牙和最近的wifi流(spp).这些流始终连接到特定设备,并通过简单的字节命令进行通信.
一些设备(他们的微控制器)我自己编程,我必须始终检查线上的信号是否是我所期望的,发送和检查crcs.
不知何故,我想在我的智能手机上做同样的事情,因为我用"readByte"访问我的流并逐字节读取,我总是想知道是否实际上可能a)消息中的一个字节可能丢失b)消息到达混合或"不按顺序"
我不知道底层硬件有多少功能.它是否使用crc检查每条消息,并在消息损坏时再次请求消息?或者它是否盲目地将每个字节传递给我的"readByte"方法?
如果设备发送消息a然后b,是否有可能接收器在a之前接收b并在传递我的代码b之前或甚至混合像拉链这样的字节并给我一个[0]然后b [0]然后a [1]等等.
我应该对这些流有多少信任?一些澄清将不胜感激
我们正在开发一个通过蓝牙使用 SPP(串行端口配置文件)的应用程序,开发人员正在讨论使用某种类型的协议和数据包传输,还是仅在没有任何形式的 ACK、序列或大小信息的情况下流式传输数据。
蓝牙是否提供有保证的传输和数据完整性,以便我们不需要数据包协议设计的开销?
我们可以仅依靠蓝牙来确保数据传输吗?