arduino 和 android 通过蓝牙进行数据传输。 NPE 问题
Data transmission between arduino and android over bluetooth. Problem with NPE
我应该将一些字符串传输到 arduino。只传,不带任何东西。
这是我的代码。我是第一次使用 android 和 kotlin。
class Validation : AppCompatActivity() {
lateinit var mmOutputStream: OutputStream
lateinit var mmSocket: BluetoothSocket
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_validation)
resolve_Btn.setOnClickListener {bluetoothAdd() }
}
@SuppressLint("HardwareIds")
private fun bluetoothAdd() {
val mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
if (mBluetoothAdapter == null) {
// Device does not support Bluetooth
Log.e("Bluetooth ", "not found")
}
if (mBluetoothAdapter!!.isEnabled) {
val pairedDevices = mBluetoothAdapter.bondedDevices
// If there are paired devices
if (pairedDevices.size > 0) {
// Loop through paired devices
for (device in pairedDevices) {
mmSocket= device.createRfcommSocketToServiceRecord(
UUID.fromString("00000000-0000-1000-8000-00805F9B34FB"))
mmSocket.connect()
mmOutputStream = mmSocket.outputStream
val message = "aaa"
val msgBuffer = message.toByteArray(Charset.defaultCharset())
mmOutputStream.write(msgBuffer)
Log.e("Mac Addressess", "are: " + mBluetoothAdapter.getRemoteDevice(device.address))
}
}
}
}
}
现在,当我添加 mmSocket!!.connect() 时,我发现了这个
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
Caused by: java.io.IOException: read failed, socket might closed or timeout, read ret: -1
at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:706)
at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:718)
at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:384)
at com.example.nikita.vas.Validation.bluetoothAdd(Validation.kt:52)
at com.example.nikita.vas.Validation.access$bluetoothAdd(Validation.kt:21)
at com.example.nikita.vas.Validation$onCreate.onClick(Validation.kt:30)
at android.view.View.performClick(View.java:6291)
at android.view.View$PerformClick.run(View.java:24931)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:101)
at android.os.Looper.loop(Looper.java:166)
您忘记在访问 outputStream
对象之前调用 mmSocket.connect()
。
试试这个:
mmSocket= device.createRfcommSocketToServiceRecord(
UUID.fromString("00000000-0000-1000-8000-00805F9B34FB"))
mmSocket.connect()
mmOutputStream = mmSocket!!.outputStream
val message = "aaa"
val msgBuffer = message.toByteArray(Charset.defaultCharset())
mmOutputStream!!.write(msgBuffer)
我应该将一些字符串传输到 arduino。只传,不带任何东西。 这是我的代码。我是第一次使用 android 和 kotlin。
class Validation : AppCompatActivity() {
lateinit var mmOutputStream: OutputStream
lateinit var mmSocket: BluetoothSocket
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_validation)
resolve_Btn.setOnClickListener {bluetoothAdd() }
}
@SuppressLint("HardwareIds")
private fun bluetoothAdd() {
val mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
if (mBluetoothAdapter == null) {
// Device does not support Bluetooth
Log.e("Bluetooth ", "not found")
}
if (mBluetoothAdapter!!.isEnabled) {
val pairedDevices = mBluetoothAdapter.bondedDevices
// If there are paired devices
if (pairedDevices.size > 0) {
// Loop through paired devices
for (device in pairedDevices) {
mmSocket= device.createRfcommSocketToServiceRecord(
UUID.fromString("00000000-0000-1000-8000-00805F9B34FB"))
mmSocket.connect()
mmOutputStream = mmSocket.outputStream
val message = "aaa"
val msgBuffer = message.toByteArray(Charset.defaultCharset())
mmOutputStream.write(msgBuffer)
Log.e("Mac Addressess", "are: " + mBluetoothAdapter.getRemoteDevice(device.address))
}
}
}
}
}
现在,当我添加 mmSocket!!.connect() 时,我发现了这个
Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) Caused by: java.io.IOException: read failed, socket might closed or timeout, read ret: -1 at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:706) at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:718) at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:384) at com.example.nikita.vas.Validation.bluetoothAdd(Validation.kt:52) at com.example.nikita.vas.Validation.access$bluetoothAdd(Validation.kt:21) at com.example.nikita.vas.Validation$onCreate.onClick(Validation.kt:30) at android.view.View.performClick(View.java:6291) at android.view.View$PerformClick.run(View.java:24931) at android.os.Handler.handleCallback(Handler.java:808) at android.os.Handler.dispatchMessage(Handler.java:101) at android.os.Looper.loop(Looper.java:166)
您忘记在访问 outputStream
对象之前调用 mmSocket.connect()
。
试试这个:
mmSocket= device.createRfcommSocketToServiceRecord(
UUID.fromString("00000000-0000-1000-8000-00805F9B34FB"))
mmSocket.connect()
mmOutputStream = mmSocket!!.outputStream
val message = "aaa"
val msgBuffer = message.toByteArray(Charset.defaultCharset())
mmOutputStream!!.write(msgBuffer)